{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[5,1],\n",
    "              [4,2],\n",
    "              [2,5],\n",
    "              [1,4],\n",
    "              [3,2],\n",
    "              [2,5],\n",
    "])#TODO\n",
    "\n",
    "y = np.array([0,0,1,1,0,1])#TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)# TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7jnL9yIiRXD61WfFSU1NNT9MFaBjx44kJCQwadIknn32WRo1asTy5csLFVflrW/fvsTGxrJ+/XoyMjJYsWKF250yE6lwSnIfIhVGImKDClUUXf20aWtPn+7fvz/9C27YVoF4enrSuXNnVq5cSefOnVUQiThabm7J7kNUsFz3CxORa6hQRZGISIld4+GuFnSESERKwOl3tBYRERGpCFQUiYiIiKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICgJetKzz11FNW200mE35+fjRs2JDY2FiqV69e5uBEREREyovNRdGOHTvYvn07ubm5NGnSBIDffvsNT09PIiIiePvtt3n66adJTk7m5ptvtnvAIiIiIo5g8+mz2NhY7rrrLo4dO8a2bdvYtm0bR44cITo6mvj4eI4ePcrtt9/Ok08+ec2x5s6dS8uWLQkKCiIoKIioqChWrVpVZP9FixZhMpksXn5+framICIiIlKIzUeKZs6cSWJiIkFBQea2KlWqMGXKFLp3787o0aN57rnn6N69+zXHCg0N5aWXXqJRo0YYhsEHH3xAbGwsO3bsoFmzZlbXCQoKYs+ePeb3JpPJ1hRERERECrG5KEpPT+fkyZOFTo3973//IyMjA4CqVaty6dKla4519913W7x/4YUXmDt3Lt9//32RRZHJZCIkJMTWsEVERESKZXNRFBsby7Bhw3jttde49dZbAdiyZQtjx44lLi4OgP/+9780btzYpnFzc3P57LPPOH/+PFFRUUX2y8zMpF69euTl5REZGcmLL75YZAEFkJ2dTXZ2tvl9QeGWk5NDTk6OTTFeS8F49h63onD3/MD9c1R+rs/dc1R+rs9ROZbHZ2YyDMOwZYXMzEyefPJJ/vWvf3H58mUAvLy8GDJkCLNmzaJy5cqkpKQA0Lp162uOt3PnTqKiorh48SIBAQEkJCTQu3dvq303b97M3r17admyJenp6bz66qusX7+e3bt3ExoaanWdKVOm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c33unqPyc32OyjEjI4OaNWs6tCgq8emzt956i9dff52lS5eyYMECJk6cSExMDMOHD6d79+5lmuw8atQovvrqK9avX29TQQTg7e1NmzZt2Ldvn9Xlvr6++Pr6Wl3PUV9IR45dEbh7fuD+OSo/1+fuOSo/12fvHMvj87LpknxfX1/i4+NJTEzk559/plmzZjz22GOEh4eTmZlp88YNw2DUqFEsW7aMb7/9lvr169s8Rm5uLjt37qRWrVo2rysiIiJSoNRXn3l4eGAymTAMg9zc3FKNMXLkSBISEvjiiy8IDAzk+PHjAFSpUoVKlSoBMHjwYOrUqcOMGTMAmDZtGh06dKBhw4acPXuWmTNncujQIUaMGFHaVERERERsO1KUnZ3Nxx9/THR0NI0bN2bnzp28+eabpKamEhAQYPPG586dS3p6Ol27dqVWrVrm1yeffGLuk5qaSlpamvn9mTNneOihh2jatCm9e/cmIyODTZs2cfPNN9u8fREREZECJT5S9Nhjj7F48WLCwsIYNmwYH3/8MTVr1izTxksyxzspKcni/axZs5g1a1aZtisiIiJytRIXRe+88w5169blpptuYt26daxbt85qv6VLl9otOBEREZHyUuKiaPDgwXqchoiIiLitEhdFixYtcmAYIiIiIs5l00RrEREREXelokhEREQEFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIRNzU6dOnCQ4O5uDBg+W63UuXLhEeHs7WrVvLdbvuSPtQypuKIhFxSy+88AKxsbGEh4cD+X/B9uzZk9q1a+Pr60tYWBijRo0iIyPDpnFnzJjBrbfeSmBgIMHBwcTFxbFnzx7zch8fH8aOHcszzzxjz3SuS1fvwyudPn2a0NBQTCYTZ8+etWlc7UMpiooiEXE7WVlZvP/++wwfPtzc5uHhQWxsLF9++SW//fYbixYtYs2aNTzyyCM2jb1u3TpGjhzJ999/T2JiIjk5OXTv3p3z58+b+wwaNIjk5GR2795tt5yuN9b24ZWGDx9Oy5YtSzW29qEURUWRiLidVatW4evrS4cOHcxt1apV49FHH6Vt27bUq1ePbt268dhjj7Fhwwabxv76668ZOnQozZo1o1WrVixatIjU1FS2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oKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgATi6K1q9fz913303t2rUxmUwsX7682P5JSUmYTKZCr+PHj5dPwCIiIuK2nFoUnT9/nlatWvHWW2/ZtN6ePXtIS0szv4KDgx0UoYiIiFwvvJy58V69etGrVy+b1wsODqZq1ar2D0hERESuW04tikqrdevWZGdn07x5c6ZMmUKnTp2K7JudnU12drb5fUZGBgA5OTnk5OTYNa6C8ew9bkXh7vmB++eo/Fyfu+eo/Fyfo3Isj8/MZBiG4fCtlIDJZGLZsmXExcUV2WfPnj0kJSXRtm1bsrOzmT9/Ph9++CE//PADkZGRVteZMmUKU6dOLdSekJCAv7+/vcIXERERB8rKymLgwIGkp6cTFBTkkG24VFFkTZcuXahbty4ffvih1eXWjhSFhYVx6tQpu3+oOTk5JCYmEh0djbe3t13HrgjcPT9w/xyVn+tz9xyVn+tzVI4ZGRnUrFnToUWRS54+u1K7du1ITk4ucrmvry++vr6F2r29vR32hXTk2BWBu+cH7p+j8nN97p6j8nN99s6xPD4vl79PUUpKCrVq1XJ2GCIiIuLinHqkKDMzk3379pnfHzhwgJSUFKpXr07dunWZOHEiR48e5V//+hcAs2fPpn79+jRr1oyLFy8yf/58vv32W7755htnpSAiIiJuwqlF0datW7njjjvM75966ikAhgwZwqJFi0hLSyM1NdW8/NKlSzz99NMcPXoUf39/WrZsyZo1ayzGEBERESkNpxZFXbt2pbh53osWLbJ4P378eMaPH+/gqEREROR65PJzikRERETsQUWRiIiICCqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQc5ffo0wcHBHDx4sNy33aFDBz7//HOb1lFRJCIiIg7xwgsvEBsbS3h4uLnNZDIVei1evNimcdevX8/dd99N7dq1MZlMLF++vFCfSZMmMWHCBPLy8ko8rooiERERsbusrCzef/99hg8fXmjZwoULSUtLM7/i4uJsGvv8+fO0atWKt956q8g+vXr14ty5c6xatarE43rZFIWIiIhICaxatQpfX186dOhQaFnVqlUJCQkp9di9evWiV69exfbx9PSkd+/eLF68mJiYmBKNqyNFIiIiYncbN27klltusbps5MiR1KxZk3bt2rFgwQIMw3BIDO3atWPDhg0l7q8jRSIiImJ3hw4donbt2oXap02bxp133om/vz/ffPMNjz32GJmZmTzxxBN2j6F27docPnyYvLw8PDyufRxIRZGIiIjY3cWLF/Hz8yvU/o9//MP85zZt2nD+/HlmzpzpkKKoUqVK5OXlkZ2dTaVKla7ZX6fPRERExO5q1KjBmTNnrtmvffv2HDlyhOzsbLvH8Mcff1C5cuUSFUSgokhEREQcoHXr1vz888/X7JeSkkK1atXw9fW1ewy7du2iTZs2Je6v02ciIiJid9HR0UyaNIkzZ85QrVo1AP7zn/9w4sQJOnTogJ+fH4mJibz44ouMHTvWprEzMzPZt2+f+f2BAwdISUmhevXq1K1b19y+YcMGunfvXuJxdaRIRERE7K5FixZERkby6aefmtu8vb156623iIqKonXr1sybN4/XX3+dyZMnm/scPHgQk8lEUlJSkWNv3bqVNm3amI8CPfXUU7Rp04bnnnvO3Ofo0aNs2rSJBx98sMQx60iRiIiIOMRzzz3HuHHjeOihh/Dw8KBnz5707Nmz2HUOHDhA1apVadWqVZF9unbtes3L+N944w2GDh1KaGhoieNVUSQiIiIOERMTw969ezl69ChhYWElWmflypU8++yz5lNupRUcHMxTTz1l0zoqikRERMRhxowZY1P/mTNn2mW7Tz/9tM3raE6RiIiI2EVubi7JyckAJCcnk5ub6+SIbOPUoqgkT7m9WlJSEpGRkfj6+tKwYUMWLVrk8DhFRESkeEuXLiU8PNz8nLGYmBjCw8NZunSpkyMrOacWRSV5yu2VDhw4QExMDHfccQcpKSmMGTOGESNGsHr1agdHKiIiIkVZunQp/fr148iRIxbtR48epV+/fi5TGDl1TlFJnnJ7pXfeeYf69evz2muvAdC0aVOSk5OZNWsWPXr0cFSYIiIiUoTc3FxGjx5t9WowwzAwmUyM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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "pt_colors = ['b', 'g', 'y']\n",
    "for i, x in enumerate(X):\n",
    "    plt.scatter(x[0], x[1], c='black')#TODO\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[:, 0], new_user[:, 1], color='red', marker='x',markersize=8)#TODO\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest_idx=idx.flatten()[0]#TODO\n",
    "nearest = X[nearest_idx]#TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')#TODO\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
